package edu.unicauca.opentextbook.controladores;

import edu.unicauca.opentextbook.entidades.Pertenece;
import edu.unicauca.opentextbook.entidades.Rol;
import edu.unicauca.opentextbook.entidades.Usuario;
import edu.unicauca.opentextbook.fachadas.PerteneceFacade;
import edu.unicauca.opentextbook.fachadas.RolFacade;
import edu.unicauca.opentextbook.fachadas.UsuarioFacade;
import edu.unicauca.opentextbook.negocio.PerteneceNegocio;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import org.apache.commons.lang3.SerializationUtils;

@ManagedBean(name = "perteneceController")
@ViewScoped
public class PerteneceController extends BaseController implements Serializable {

    @ManagedProperty("#{loginController}")
    private LoginController loginController;
    //EJBs
    @EJB
    private PerteneceFacade perteneceFacade;
    @EJB
    private UsuarioFacade usuarioFacade;
    @EJB
    private RolFacade rolFacade;
    //Objetos
    private Pertenece pertenece;
    private PerteneceNegocio perteneceNegocio;
    //Listas
    private List<Usuario> listaUsuarios;
    private List<Rol> listaRol;
    private List<Pertenece> listaPertenece;

    //Metodos
    @PostConstruct
    public void init() {
        pertenece = new Pertenece();
        perteneceNegocio = new PerteneceNegocio();
        listaUsuarios = usuarioFacade.buscarTodos();
        listaRol = rolFacade.buscarTodosMenosSenior();
        listaPertenece = new ArrayList<Pertenece>();
    }

    public void agregarParticipante() {
        if (perteneceNegocio.validarExistenciaEnLista(listaPertenece, pertenece)) {
            anadirMensajeError("El Usuario ya tiene el Rol dentro del Grupo");
        } else {
            try {
                userTransaction.begin();
                perteneceFacade.create(clonarObjeto(pertenece));
                commitTransaction();
                listaPertenece.add(clonarObjeto(pertenece));
                pertenece.setRol(null);
                anadirMensajeInfo("Registro Exitoso");
            } catch (Exception ex) {
                Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
                anadirMensajeError("Error al registar");
            }
        }
    }

    public void consultarParticipantes() {
        listaPertenece = perteneceFacade.consultarPorGrupo(pertenece.getGrupo().getIdGrupo());
    }

    public boolean validarSenior(int idGrupo) {
        final Usuario usuario = usuarioFacade.buscarUsuarioPorNick(loginController.getNick());
        final Pertenece p = perteneceFacade.consultarSenior(idGrupo);

        if (usuario.getNick().equals(p.getUsuario().getNick())) {
            return true;
        }
        return false;
    }

    //Getters y Setters
    public Pertenece getPertenece() {
        return pertenece;
    }

    public void setPertenece(Pertenece pertenece) {
        this.pertenece = pertenece;
    }

    public List<Usuario> getListaUsuarios() {
        return listaUsuarios;
    }

    public void setListaUsuarios(List<Usuario> listaUsuarios) {
        this.listaUsuarios = listaUsuarios;
    }

    public List<Rol> getListaRol() {
        return listaRol;
    }

    public void setListaRol(List<Rol> listaRol) {
        this.listaRol = listaRol;
    }

    public List<Pertenece> getListaPertenece() {
        return listaPertenece;
    }

    public void setListaPertenece(List<Pertenece> listaPertenece) {
        this.listaPertenece = listaPertenece;
    }

    public LoginController getLoginController() {
        return loginController;
    }

    public void setLoginController(LoginController loginController) {
        this.loginController = loginController;
    }

    //Clonar
    private Pertenece clonarObjeto(Pertenece objeto) {
        Pertenece objetoClonado = null;
        if (objeto == null) {
            return null;
        } else {
            try {
                objetoClonado = (Pertenece) SerializationUtils.clone(objeto);
            } catch (Exception e) {
                objetoClonado = null;
            } finally {
                return objetoClonado;
            }
        }
    }

    //Converter
    @FacesConverter(forClass = Pertenece.class)
    public static class PerteneceControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            PerteneceController controller = (PerteneceController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "perteneceController");
            return controller.perteneceFacade.find(getKey(value));
        }

        int getKey(String value) {
            int key;
            key = Integer.parseInt(value);
            return key;
        }

        String getStringKey(int value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Pertenece) {
                Pertenece o = (Pertenece) object;
                return getStringKey(o.getIdPertenece());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Pertenece.class.getName());
            }
        }
    }
}
